package ControleurBelote;

import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;

import VueBelote.Vue;

public class ControleurBelote {

	private Joueur[] joueurs;
	private PaquetCarte paquet;
	private TableBelote table;
	private LinkedList<Carte> dernierePli;
	private Carte premiereCarteJouer;
	//private Vue vue;
	private HashMap<String,Equipe> equipe;
	
	public ControleurBelote(){}
	
	public ControleurBelote(Joueur[] jouer,PaquetCarte tas,TableBelote tapis) throws Throwable{
		joueurs = jouer;
		equipe = new HashMap<String,Equipe>();
		creerEquipe(jouer);
		paquet = tas;
		tas.melanger();
		table = tapis;
		dernierePli = new LinkedList<Carte>();
		premiereCarteJouer = new Carte();
		//vue = new Vue();	
		
	}
	
	public void creerEquipe(Joueur[] jouer){
		int i =0,j = 0;
		for(i = 0;i<jouer.length;i++){
			for(j=0;j<jouer.length;j++){
				if(jouer[j].getIdentEquipe().equals(jouer[i].getIdentEquipe())
						&& !(jouer[j].equals(jouer[i]))){
					
					equipe.put(jouer[i].getIdentEquipe(),new Equipe(jouer[j]
					        ,jouer[i],
							jouer[i].getIdentEquipe()));
				}
			}
		}
	}
	
	public void belote(Joueur jouer){
		int i = 0; 
		for(i =0 ; i<table.getCartePose().size();i++){
			if(table.getCartePose().get(i).getAtout() &&
					table.getCartePose().get(i).getValeur() == 3 ||
					table.getCartePose().get(i).getValeur() == 4 && 
					table.getCartePose().get(i).getJoueur().equals(jouer) ){
				jouer.setBelote(true);
			}
		}
	}
	
	public void reBelote(Joueur jouer){
		int i = 0; 
		for(i =0 ; i<table.getCartePose().size();i++){
			if(table.getCartePose().get(i).getAtout() &&
					table.getCartePose().get(i).getValeur() == 3 ||
					table.getCartePose().get(i).getValeur() == 4 && 
					table.getCartePose().get(i).getJoueur().equals(jouer) && 
					jouer.getBelote()){
				equipe.get(jouer.getIdentEquipe()).setPoint(20);
			}
		}
	}
	
	public Carte distribuer(){
		int i =0,j = 0;
		for(i = 0;i<5;i++){
			for(j = 0;j<joueurs.length;j++){
				joueurs[j].ajouterUneCarte(paquet.obtenirCarte(0));
			}
		}
		return paquet.obtenirCarte(0);
	}
	
	public void gagnantPli(){
		LinkedList<Carte> pli = table.getCartePose();
		int i = 0, point =0;
		Carte gagnante = pli.get(0);
		
		for(i = 1;i<pli.size();i++){
			if(gagnante.getAtout() && pli.get(i).getAtout() || 
					!(gagnante.getAtout()) && !(pli.get(i).getAtout())){
				if(gagnante.getValeur() < pli.get(i).getValeur()){
					gagnante = pli.get(i);
				}	
			}else{
				if(!(gagnante.getAtout())){
					gagnante = pli.get(i);
				}
			}
			
		}
		
		for(i = 0;i<pli.size();i++){
			point += pli.get(i).getValeur();
		}
		gagnante.getJoueur().ajoutPliCarte(pli,point);
		gagnante.getJoueur().ajoutPliPoint(table.valeurPli());
		table.enleverCarte();
		setDernierePli(pli);
		dixDeDerre(gagnante.getJoueur());
	}
	
	public void possibiliteJouerCarte(){
		int i = 0,j = 0;
		for(i = 0;i<joueurs.length;i++){
			for(j=0;j<joueurs[i].getMain().getTas().size();j++){
				if(!(joueurs[i].getMain().getTas().get(j).getCouleur() == 
					premiereCarteJouer.getCouleur() )|| 
					!(joueurs[i].getMain().getTas().get(j).getAtout() )&&
					!(premiereCarteJouer.getJoueur().equals(joueurs[i]))){
					joueurs[i].getMain().getTas().get(j).setPeutEtreJouer(false);
				}
			}
		}
	}
	
	public void distribuerSecond(Joueur player){
		int i =0,j = 0;
		for(i = 0;i<3;i++){
			for(j = 0;j<joueurs.length;j++){
				if(!(player.equals(joueurs[j]) && i == 2)){
					joueurs[j].ajouterUneCarte(paquet.obtenirCarte(0));
				}
			}
		}
	}
	
	public void distribuerSecond(){
		int i =0,j = 0;
		for(i = 0;i<3;i++){
			for(j = 0;j<joueurs.length;j++){
					joueurs[j].ajouterUneCarte(paquet.obtenirCarte(0));
			}
		}
	}
	
	public void appliquerAtout(Carte carte){
		int i = 0;
		
		Equipe eq = equipe.get(carte.getJoueur().getIdentEquipe());
		eq.setChoisiAtout(true);
		for(i = 0;i<joueurs.length;i++){
			joueurs[i].affecterAtout(carte.getCouleur());
		}
	}
	
	public void appliquerAtout(String couleur,Joueur joueur){
		int i = 0;
		
		Equipe eq = equipe.get(joueur.getIdentEquipe());
		eq.setChoisiAtout(true);
		for(i = 0;i<joueurs.length;i++){
			joueurs[i].affecterAtout(couleur);
		}
	}
	
	public boolean jouerCarte(Carte carte){
		if(table.getCartePose().size() == 4){return false;}
		Joueur J = carte.getJoueur();
		J.enleverUneCarte(carte);
		table.setCarte(carte);
		return true;
	}
	
	public void validerPoint(){
		int i = 0,totalPoint = 0,totalPointPasAtout = 0;
		LinkedList<Joueur> eq = new LinkedList<Joueur>();
		Equipe equip= new Equipe();
		LinkedList<Joueur> eqPasAtout = new LinkedList<Joueur>();
		Equipe equipPasAtout = new Equipe();
		for(i = 0; i<joueurs.length;i++){
			if(equipe.get(joueurs[i].getIdentEquipe()).getChoisiAtout()){
				eq = equipe.get(joueurs[i].getIdentEquipe()).getJoueur();
				equip = equipe.get(joueurs[i].getIdentEquipe());
			}else{
				eqPasAtout = equipe.get(joueurs[i].getIdentEquipe())
				.getJoueur();
				equipPasAtout = equipe.get(joueurs[i].getIdentEquipe());
			}
		}
		for(i = 0;i<eq.size();i++){
			totalPoint += eq.get(i).getPliPoint();
			totalPointPasAtout += eqPasAtout.get(i).getPliPoint();
		}
		if(totalPoint >= 82){
			equip.setPoint(totalPoint);
			equipPasAtout.setPoint(totalPointPasAtout);
		}else{
			equip.setPoint(0);
			equipPasAtout.setPoint(162);
		}
	}
	
	public void dixDeDerre(Joueur jouer){
		int i = 0 , k = 0;
		for(i = 0;i<joueurs.length;i++){
			if(joueurs[i].getMain().getTas().size() == 0){
				k++;
			}
		}
		if(k == joueurs.length){
			equipe.get(jouer.getIdentEquipe()).setPoint(10);
		}
	}
	
	public void nouvelleManche(){
		int i =0;
		LinkedList<Carte> totalCarte = new LinkedList<Carte>();
		for(i = 0;i<joueurs.length;i++){
			totalCarte.addAll(joueurs[i].viderPli());
			joueurs[i].ajoutPliPoint(0);
		}
		
		paquet.ajouterPlusieursCarte(totalCarte);
		paquet.melanger();
		distribuer();
	}
	
	public void changerEquipe(Joueur jouer){
		int i =0;
		LinkedList<Joueur> joueurE = new LinkedList<Joueur>();
		for(i = 0;i<joueurs.length;i++){
			if(!(jouer.getIdentEquipe().equals(joueurs[i].getIdentEquipe()))){
				jouer.setIdentEquipe(joueurs[i].getIdentEquipe());
				equipe.get(joueurs[i].getIdentEquipe()).setJoueur(jouer);
			}
		}
		
		@SuppressWarnings("rawtypes")
		Iterator iEquipe = equipe.keySet().iterator();
		while(iEquipe.hasNext()){
			Equipe eq = equipe.get(iEquipe);
			if(eq.getJoueur().size() > joueurs.length/2){
				joueurE = eq.getJoueur();
			}
			if(!(joueurE.get(1).getIdentEquipe().equals(eq.getIdentite()))){
				eq.setJoueur(joueurE.get(1));
			}
		}
		
	}
	
	public void nouvellePartie(){
		@SuppressWarnings("rawtypes")
		Iterator iEquipe = equipe.keySet().iterator();
		while(iEquipe.hasNext()){
			Equipe eq = equipe.get(iEquipe);
			eq.mettreAZero();
		}
		nouvelleManche();
	}
	
	public void sauvegarder(){
		
	}
	
	public void charger(String nomFichier){
		
	}
	
	
//-----------------------------------------------------------------------------
//								Guetters
//-----------------------------------------------------------------------------
	
	public LinkedList<Carte> getDernierePli(){return dernierePli;}
	public Joueur[] getJoueurs(){return joueurs;}
	public PaquetCarte getPaquet(){return paquet;}
	public TableBelote getTable(){return table;}
	public Carte getPremiereCarteJouer(){return premiereCarteJouer;}
	public HashMap<String,Equipe> getEquipe(){return equipe;}
	
//-----------------------------------------------------------------------------
//								Setters
//-----------------------------------------------------------------------------

	public void setJoueurs(Joueur[] joueurs){ this.joueurs = joueurs;}
	public void setPaquet(PaquetCarte tas){ paquet = tas;}
	public void setTable(TableBelote table){this.table = table;}
	public void setPremiereCarte(Carte carte){premiereCarteJouer = carte;}
	public void setDernierePli(LinkedList<Carte> pli){dernierePli = pli;}
	public void setEquipe(HashMap<String,Equipe> equipe){this.equipe = equipe;}
	
	public String toString(){
		int i = 0;
		String player = new String();
		
		for(i = 0; i<joueurs.length;i++){
			player += joueurs[i].toString();
		}
		return player + paquet.toString();
	}
	
	public static void main (String[] args) throws Throwable {
		
		Joueur[] joueur = new Joueur[4];
		joueur[0] = new Joueur("paul","A");
		joueur[1] = new Joueur("kevin","B");
		joueur[2] = new Joueur("lucas","A");
		joueur[3] = new Joueur("sidonie","B");
		PaquetCarte tas = new PaquetCarte("Carte");
		TableBelote table = new TableBelote();
		ControleurBelote CB = new ControleurBelote(joueur,tas,table);
		Carte dessus = CB.distribuer();
		
		joueur[1].ajouterUneCarte(dessus);
		CB.distribuerSecond(joueur[1]);
		CB.appliquerAtout(dessus);
		
		System.out.println(joueur[0]+"\n\n");
		System.out.println(joueur[1]+"\n\n");
		System.out.println(joueur[2]+"\n\n");
		System.out.println(joueur[3]+"\n\n");
		
		
	}
}
